import exception.TooManyListeners;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import serial.SerialPortManager;

import java.util.ArrayList;

public class MainSerial {

    private static SerialPort serialPort;

    public static void main(String[] args) {
        new MainSerial();
    }

    public MainSerial() {
        // 获取当前机器所有可使用串口
        ArrayList<String> arr_serial = SerialPortManager.findPort();

        // 打开当前串口
        if(arr_serial==null || arr_serial.size()<=0)return;
        // 默认波特率
        try{
            serialPort = SerialPortManager.openPort(arr_serial.get(0),9600);

            /**
             * 读取串口数据方式
             * 1.直接读取串口
             * 2.监控串口有数据了再去读取
             */
            // 1 直接读取串口数据
            SerialPortManager.readFromPort(serialPort);

            // 2.监控串口有数据了再去读取
            serialPort.removeEventListener();
            try {
                SerialPortManager.addListener(serialPort, new SerialListener());
            } catch (TooManyListeners e) {

            }

        }catch (Exception e){

        }
    }

    /**
     * 处理监控到的串口事件
     */
    private class SerialListener implements SerialPortEventListener {
        /**
         * 处理监控到的串口事件
         */
        public void serialEvent(SerialPortEvent serialPortEvent) {

            switch (serialPortEvent.getEventType()) {

                case SerialPortEvent.BI: // 10 通讯中断
                    // ShowUtils.errorMessage("与串口设备通讯中断");
                    break;
                case SerialPortEvent.OE: // 7 溢位（溢出）错误

                case SerialPortEvent.FE: // 9 帧错误

                case SerialPortEvent.PE: // 8 奇偶校验错误

                case SerialPortEvent.CD: // 6 载波检测

                case SerialPortEvent.CTS: // 3 清除待发送数据

                case SerialPortEvent.DSR: // 4 待发送数据准备好了

                case SerialPortEvent.RI: // 5 振铃指示

                case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空
                    break;

                case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据

                    byte[] data = SerialPortManager.readFromPort(serialPort);

                    break;
            }
        }


    }

}
